//  @2023-9-15: 删除针对菊花链构型的SPI配置（菊花链构型的配置独立出来，放在Daisy.h Daisy.c）
//  DACx0508
//  SPI data format for DACx0508 24bits in total
//  |R/W|Re2|Re1|Re0|A3|A2|A1|A0|D15|D14|...|D5|D4|D3|D2|D1|D0| 
//  Re == reserved

#include <stdio.h>
#include <stdlib.h>

#include "COMMON.h"
#include "SPI.h"

#ifndef _DACX0508_H_
#define _DACX0508_H_

#define _DACX0508_REG_NUM_  10

// for DACx0508, MAX(code) = 2^16-1
#define _CODE_VAL_MAX_              65535
#define _DEFAULT_STEPS_             10
#define _DEFAULT_SLEEP_TIME_US_     1000000
#define _DACX0508_CNT_MAX_          20

typedef struct _DACx0508_Config{

    int         is_single;      // 单片DACX0508在使用时有两路输出需要作修正

    int         reg_num;        // number of data to be sent via SPI, 10
    uint32_t    reg_addr[10];
    uint32_t    reg_data[10];   
    double      gain[8];        // 这部分电路的增益
    double      vout[8];        // 设计的经过放大后的电压值（有两个
    double      vout_f[8];      // 用于保存实际输出的电压
    
    uint32_t    steps;
    uint32_t    sleep_time_us;
    char        cfg_fname[1024];    // 记录配置文件的文件名
    char        cfg_section[1024];  // 记录section的名称，这对于Daisy模式下的配置有帮助
} DACx0508_Config;

void init_dacx0508_config( DACx0508_Config *cfg );
void read_dacx0508_config( DACx0508_Config *cfg, 
                            char *cfg_ini, 
                            char *section );

void free_dacx0508_config( DACx0508_Config *cfg );

//  复制配置参数
int duplicate_DACx0508( DACx0508_Config *cfg_old, DACx0508_Config *cfg_new );

uint32_t get_dac_code( double vout, double gain );

//  print DACx0508 configurations for debug
int print_dacx0508_config( DACx0508_Config *cfg );

//  update configuration for a 'opt' with value 'opt_val'
int update_dacx0508_config( DACx0508_Config *cfg,
                            int mode, 
                            char* opt, 
                            int opt_val );

int config_dacx0508_via_SPI(uint32_t *gpio_reg, 
					        uint32_t *gpio2_reg, 
					        uint32_t *gpio_in_reg,
					        SPI_CONFIG *spi_config,
					        DACx0508_Config *cfg,
                            uint32_t state
					        );

//  这个函数主要用于对以"菊花链"方式连在一起的3个芯片,从当前配置(old)更新至新配置(new)
//  相比原先的配置过程,这个函数需要两个配置数据结构体
//      DACx0508_Config *dac70508_cfg_old,
//      DACx0508_Config *dac70508_cfg_new,
int adjust_dacx0508_via_SPI(uint32_t *gpio_reg, 
					        uint32_t *gpio2_reg, 
					        uint32_t *gpio_in_reg,
					        SPI_CONFIG *spi_config,
					        DACx0508_Config *cfg_old,
					        DACx0508_Config *cfg_new
					        );
#endif // _DACx0508_H_
